home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / sml_nj / 93src.lha / src / util / dynamic.sml < prev    next >
Encoding:
Text File  |  1993-01-27  |  1.3 KB  |  48 lines

  1. (* Copyright 1989 by AT&T Bell Laboratories *)
  2. signature STATIC_ARRAY = sig type array
  3.                  exception Subscript
  4.                  type elem
  5.                  val array : int * elem -> array
  6.                  val sub : array * int -> elem
  7.                  val update : (array * int * elem) -> unit
  8.                  val length : array -> int
  9.              end
  10.  
  11. signature DYNAMIC_ARRAY = sig type array 
  12.                   exception Subscript 
  13.                   type elem 
  14.                   val array : elem -> array
  15.                   val sub : array * int -> elem
  16.                   val update : (array * int * elem) -> unit
  17.               end
  18.  
  19. functor Dynamic( A : STATIC_ARRAY ) : DYNAMIC_ARRAY =
  20. struct
  21.      type array = {default: A.elem, arr: A.array ref}
  22.      type elem = A.elem
  23.      exception Subscript
  24.      infix 9 sub
  25.      fun array e = {default=e, arr= ref(A.array(0,e))};
  26.      fun {default, arr as ref a} sub i = 
  27.     A.sub(a,i)
  28.     handle A.Subscript =>
  29.         if i < 0 then raise Subscript
  30.         else default
  31.      fun update ({default,arr as ref a}, i, e) =
  32.        A.update(a,i,e)
  33.        handle A.Subscript =>
  34.        if i<0 then raise Subscript
  35.        else
  36.        let val size = A.length a
  37.        val newsize = i + size + 1
  38.        val a2 = A.array(newsize, default)
  39.        fun copy j = (A.update(a2,j,A.sub(a,j)); copy(j-1))
  40.        in (copy (size - 1) handle A.Subscript => ());
  41.       arr := a2;
  42.       A.update(a2,i,e)            
  43.        end
  44.  
  45. end
  46.  
  47.  
  48.